package com.qqn.acknowledge.reflection;

import java.lang.reflect.Field;

/**
 * @ClassName: ReflectVisit
 * @Description: ReflectVisit
 * @Author: 刘神仙
 * @Date: 2025-03-25 21:15
 */
public class ReflectVisit {
    public static void main(String[] args) throws ClassNotFoundException {
        // 获取class对象的三种方式
        // 第一种  类.class
        // 使用 类.class 不会触发类的初始化，只有在访问类的成员或者访问该类的实例时才会被触发
        // Class<User> userClass = User.class;

        // 第二种 使用对象的
        // User user = new User("Albert", 20);
        // 这里泛型参数用 通配符 因为这个Class对象是在运行时从User实例获取的，而 User实例的具体类型只能在运行时创建和确定
        // 在编译阶段无法准确的判断 Class 对象的确切类型
        // Class<?> clazz = user.getClass();

        // 第三种 使用 Class的 forName 静态方法，这种方法用于在运行时动态加载指定的类，并返回该类的 Class 对象实例，
        // 通常用于类名在编译时不可知的场景中
        // 通过这种方法获取的类的 Class 对象时会立即触发类的初始化，类的静态初始化块 static 块会被执行
        Class<?> clazz = Class.forName("com.qqn.acknowledge.reflection.User");
        // Field[] fields = clazz.getDeclaredFields(); // 获取当前类的所有字段 共有私有都可以 但是不能获取到父类的字段，返回一个 field 类型的数组
        // for (Field field : fields) {
        //     System.out.println(field.getName());
        // }

        // Field[] fields1 = clazz.getFields(); // 获取当前类的public字段,包括父类的 public 字段
        // for (Field field : fields1) {
        //     System.out.println(field.getName());
        // }

        Field[] fields = clazz.getSuperclass().getDeclaredFields(); // 直接获取父类的字段
        for (Field field : fields) {
            System.out.println(field.getName());
        }


    }
}
